const path = require('path')

const resolve = (dir) => {
	return path.join(__dirname, dir)
}

// 导入compression-webpack-plugin
const CompressionWebpackPlugin = require('compression-webpack-plugin')
// js混淆压缩
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
// 定义压缩文件类型
const productionGzipExtensions = ['js', 'css']
// 打包分析
const BundleAnalyzerPlugin =
	require('webpack-bundle-analyzer').BundleAnalyzerPlugin

// 项目部署基础
// 默认情况下，我们假设你的应用将被部署在域的根目录下,
// 例如：https://www.my-app.com/
// 默认：'/'
// 如果您的应用程序部署在子路径中，则需要在这指定子路径
// 例如：https://www.foobar.com/my-app/
// 需要将它改为'/my-app/'
module.exports = {
	//输出文件目录
	indexPath: 'index.html',
	outputDir: 'dist',
	assetsDir: 'assets',
	publicPath: process.env.NODE_ENV === 'production' ? '/' : '/',
	//是否使用包含运行时编译器的 Vue 构建版本
	runtimeCompiler: false,
	// 如果你不需要使用eslint，把lintOnSave设为false即可
	lintOnSave: false,
	//是否为 Babel 或 TypeScript 使用 thread-loader。该选项在系统的 CPU 有多于一个内核时自动启用，仅作用于生产构建，在适当的时候开启几个子进程去并发的执行压缩
	parallel: require('os').cpus().length > 1,
	//对内部的 webpack 配置进行更细粒度的修改 https://github.com/neutrinojs/webpack-chain see https://github.com/vuejs/vue-cli/blob/dev/docs/webpack.md
	chainWebpack: (config) => {
		// 修复HMR
		config.resolve.symlinks(true)
		//修复 Lazy loading routes Error
		config.plugin('html').tap((args) => {
			args[0].chunksSortMode = 'none'
			return args
		})

		// 路径别名
		config.resolve.alias
			.set('@', resolve('src')) // key,value自行定义，比如.set('@@', resolve('src/components'))
			.set('_c', resolve('src/components'))

		//压缩图片
		/*config.module
      .rule('images')
      .use('image-webpack-loader')
      .loader('image-webpack-loader')
      .options({})*/

		// 移除 prefetch 插件
		config.plugins.delete('prefetch')
	},
	//调整 webpack 配置 https://cli.vuejs.org/zh/guide/webpack.html#%E7%AE%80%E5%8D%95%E7%9A%84%E9%85%8D%E7%BD%AE%E6%96%B9%E5%BC%8F
	configureWebpack: (config) => {
		let pluginsPro = [
			// js压缩
			new UglifyJsPlugin({
				uglifyOptions: {
					compress: {
						drop_console: true,
						drop_debugger: true,
						pure_funcs: ['console.log'] //移除console
					},
					warnings: true,
					mangle: false,
					output: {
						beautify: true //压缩注释
					}
				},
				sourceMap: false,
				parallel: true
			})
			// 开启gzip
			/*new CompressionWebpackPlugin({
        filename: '[path].gz[query]',
        algorithm: 'gzip',
        test: new RegExp('\\.(' + ['js', 'css'].join('|') + ')$',),
        threshold: 10240,
        minRatio: 0.8
      }),*/
			// 打包分析
			// new BundleAnalyzerPlugin()
		]

		//开发环境
		let pluginsDev = [
			//移动端模拟开发者工具(https://github.com/diamont1001/vconsole-webpack-plugin  https://github.com/Tencent/vConsole)
			/*new vConsolePlugin({
        filter: [], // 需要过滤的入口文件
        enable: true // 发布代码前记得改回 false
      }),*/
		]

		// 为生产环境修改配置...process.env.NODE_ENV !== 'development'
		if (process.env.NODE_ENV === 'production') {
			config.plugins = [...config.plugins, ...pluginsPro]
		} else {
			// 为开发环境修改配置...
			config.plugins = [...config.plugins, ...pluginsDev]
		}
		// //配置 externals
		// //防止将某些 import 的包(package)打包到 bundle 中，而是在运行时(runtime)再去从外部获取这些扩展依赖
		// config.externals = {
		//     'vue': 'Vue',
		//     'element-ui': 'ELEMENT',
		//     'vue-router': 'VueRouter',
		//     'vuex': 'Vuex',
		//     'axios': 'axios'
		// }
	},
	css: {
		extract: true,
		sourceMap: false, // 是否在构建样式地图，false将提高构建速度
		// 为所有的 CSS 及其预处理文件开启 CSS Modules。
		// 这个选项不会影响 `*.vue` 文件。
		modules: false
	},
	// 设为false打包时不生成.map文件
	productionSourceMap: false,
	// 这里写你调用接口的基础路径，来解决跨域，如果设置了代理，那你本地开发环境的axios的baseUrl要写为 '' ，即空字符串
	devServer: {
		// host: '172.16.1.28',
		port: 4200, //食堂端端口
		// port: 4220,   //机关端端口
		proxy: {
			'/api': {
				//流峰接口
				// target: 'http://172.16.1.27:12570',
				// 测试环境⬇⬇⬇
				target: 'http://172.16.10.75:4200',
				changeOrigin: true,
				pathRewrite: {
					'^/api': '/'
				}
			},
			'/statics': {
				//下载静态资源代理
				// target: 'http://172.16.1.27:12570',
				// 测试环境⬇⬇⬇
				target: 'http://172.16.10.75:4200',
				changeOrigin: true,
				pathRewrite: {
					'^/statics': '/statics'
				}
			},
			'/ouapi': {
				//欧工
				// target: 'http://172.16.1.27:12570',
				target: 'http://172.16.10.75:4200',
				changeOrigin: true,
				pathRewrite: {
					'^/ouapi': '/api'
				}
			}
		}
	}
}
